//
// Created by LiuYou on 2021/10/20.
//

#include <iostream>
#include <unistd.h>
#include <cstring>
#include <sys/wait.h>


static const int LEFT = 30000000;
static const int RIGHT = 30000200;
static const int PROCESS_NUM = 3;


/**
 * @brief
 * @details 用 201 个子进程来计算这 201 个待计算的任务。
 * 那就是每次产生一个待计算的 i 值, 我就马上 fork(); 把这个 i 扔给子进程。
 *
 * 进程分配之交叉分配法。
 *
 *
 * @param argc
 * @param argv
 * @return
 */

int main(int argc, char** argv) {
    int mark{};

    for (int i = 0; i < PROCESS_NUM; ++i) {
        pid_t pid = fork();
        if (pid < 0) {
            perror( "fork()" );
            exit( 1 );
        }
        if (pid == 0) {
            for (int j = LEFT + i; j <= RIGHT; j += PROCESS_NUM) {

                mark = 1;
                for (int k = 2; k < j / 2; ++k) {
                    if (j % k == 0) {
                        mark = 0;
                        break;
                    }
                }
                if (mark == 1) {
                    printf( "[%d]%d 是一个质数。\n", i, j );
                }


            }
            exit( 0 );
        }
    }


    for (int i = 0; i < PROCESS_NUM; ++i) {
        wait( nullptr );
    }

    return 0;
}
